﻿using Jacobi.Vst.Core;
using Levfier.Proccessors.Chains;
using System;

namespace Levfier.Proccessors
{
    /// <summary>
    /// プロセッサコントロールを複数所持する
    /// </summary>
    [Serializable]
    public class Amplifier
    {
        /// <summary>
        /// 入力の接続オブジェクト配列
        /// </summary>
        public BoundChain[] InputChains { get; set; }

        /// <summary>
        /// 出力の接続オブジェクト配列
        /// </summary>
        public BoundChain[] OutputChains { get; set; }

        /// <summary>
        /// 処理を行う
        /// </summary>
        public void Proccess()
        {
            foreach (IChainable chain in this.InputChains)
            {
                chain.FlowSounds();
            }
        }

        /// <summary>
        /// 入力バッファを初期化する
        /// </summary>
        /// <param name="inChannels">入力チャネル</param>
        public void InitInputStream(VstAudioBuffer[] inChannels)
        {
            this.InputChains = new BoundChain[inChannels.Length];

            //入力チャネルを設定
            for (int i = 0; i < inChannels.Length; i++)
            {
                this.InputChains[i] = new BoundChain(inChannels[i].SampleCount, true);
            }
        }

        /// <summary>
        /// 出力バッファを初期化する
        /// </summary>
        /// <param name="outChannels">出力チャネル</param>
        public void InitOutputStream(VstAudioBuffer[] outChannels)
        {
            this.OutputChains = new BoundChain[outChannels.Length];

            //出力チャネルを設定
            for (int i = 0; i < outChannels.Length; i++)
            {
                this.OutputChains[i] = new BoundChain(outChannels[i].SampleCount, false);
            }
        }

        /// <summary>
        /// 入力チャネルからバッファに音をコピーする
        /// </summary>
        /// <param name="inChannels">入力チャネル</param>
        public void CopyFromInput(VstAudioBuffer[] inChannels)
        {
            for (int i = 0; i < inChannels.Length; i++)
            {
                this.InputChains[i].CopyFrom(inChannels[i]);
            }
        }

        /// <summary>
        /// 出力チャネルにバッファから音をコピーする
        /// </summary>
        /// <param name="outChannels">入力チャネル</param>
        public void CopyToOutput(VstAudioBuffer[] outChannels)
        {
            for (int i = 0; i < outChannels.Length; i++)
            {
                this.OutputChains[i].CopyTo(outChannels[i]);
            }
        }
    }
}
